package com.ruyuan.rapid.discovery.api;

import com.ruyuan.rapid.common.util.Pair;

import java.util.List;

/**
 * 顶级注册接口
 * @author mac
 */
public interface Registry {

    /**
     * 存储所有的服务定义信息:ServiceDefinition,永久存储
     */
    String SERVICE_PREFIX = "/services";
    /**
     * 这个目录存储所有的服务实例信息: ServiceInstance, 加载时存储
     */
    String INSTANCE_PREFIX = "/instances";
    /**
     * 存储所有的规则信息,永久存储
     */
    String RULE_PREFIX = "/rules";
    /**
     * 存储所有的网关本身自注册信息: rapid-core(也是加载时存储)
     */
    String GATEWAY_PREFIX = "/gateway";

    String PATH = "/";

    /**
     * 注册一个路径如果不存在
     * @param path
     * @param value
     * @param isPersistent
     * @throws Exception
     */
    void registerPathIfNotExists(String path, String value, boolean isPersistent) throws Exception;

    /**
     * 注册一个临时节点
     * @param key
     * @param value
     * @return
     */
    long registerEphemeralNode(String key, String value) throws Exception;

    /**
     * 注册一个永久节点
     * @param key
     * @param value * @throws Exception
     */
    void registerPersistentNode(String key, String value) throws Exception;

    /**
     * 通过前缀路径, 获取一堆对应的数据信息
     * @param prefix
     * @return * @throws Exception
     */
    List<Pair<String, String>> getListByPrefixKey(String prefix) throws Exception;

    /**
     * 根据一个key查询对应的键值对对象
     * @param key
     * @return
     * @throws Exception
     */
    Pair<String, String> getByKey(String key) throws Exception;

    boolean isExistKey(String key) throws Exception;

    /**
     * 删除
     * @param key
     * @throws Exception
     */
    void deleteByKey(String key) throws Exception;

    /**
     * 关闭
     * @throws Exception
     */
    void close() throws Exception;
}
